#pragma once

#include "Node.h"
#include "Lexer.h"
#include "Token.h"
#include "vm.h"
#include "Expr.h"
#include "Assignable.h"

class Parser
{
public:
    Parser(Lexer * _lexer, vm *_env);
    virtual ~Parser(void);
    void Program();
    void Run();

private:
    void Move();
    void Match(int tag);
    void Statement();
    Expr *ParseRelEqu();
    Expr *ParseRel();
    Expr *ParseEqu();
    Expr *ParseExp();
    Expr *ParseTerm();
    Expr *ParseUnary();
    Expr *ParsePow();
    Expr *ParseFunc();
    Expr *ParseFactor();
    Assignable *ParseAssignable();
    void ParsePrint(int ln);
    void ParseInput(int ln);
    void ParseRead(int ln);
    void ParseData(int ln);

    Lexer *lexer;
    Token *look;
    vm *env;
};

